package demo3

// 装饰器设计模式
type Component interface{
	Calc() int
}

type BaseCalc struct{
}
// 构造
func NewBase() *BaseCalc {return &BaseCalc{}}
// 动作
func (*BaseCalc)Calc() int{
	return 0
}

type AddDecotorCalc struct{
	Component
	num int
}

fun NewAddDecotorCalc(c Component, num int) *AddDecotorCalc{
	return &AddDecotorCalc{
		Component:c,
		num:num,
	}
}

func (a *AddDecotorCalc)Calc() int{
	return a.Calc() + a.num
}
// call 调用如下
// base := &BaseCalc{}
// c := NewAddDecotorCalc(base,10)

// c.Calc()
// -----------------------------SPLIT-----------------------------------------

package demo11

// 迭代器设计模式


import (
	"fmt"
)

// 存放迭代器的聚集结构
type Aggregate interface{
	// 迭代器 生成
	Iterator() Iterator
}

type Iterator interface{
	// 迭代器的构造
	First() // 逻辑业务开始地方
	IsDone() bool // 逻辑业务临界点
	Next() interface{} // 迭代的方法
}

// 迭代对象的类型和结构这里可以做不同的调整
type Numbers struct {
	// 定义计数器来 控制生成迭代对象
	start, end int
}

func NewNumbers(start,end int) *Numbers{
	return &Numbers{
		start:start,
		end:end,
	}
}

func (n *Numbers)Iterator() Iterator{
	return &NumbersIterator{
		numbers :n,
		next : n.start,
	}
}

type NumbersIterator struct{
	numbers *Numbers
	next int
}

func (i *NumbersIterator)First(){
	i.next = i.numbers.start
}

func (i *NumbersIterator)IsDone() bool{
	return i.next > i.numbers.end
}

func (i *NumbersIterator)Next() interface{}{
	if !i.IsDone(){
		next := i.next
		i.next++
		return next
	}
	return nil
}

func IteratorPrint(i Iterator){
	for i.First();!i.IsDone();{
		c := i.Next()
		fmt.Printf("%#v\n",c)
	}
}

// 模板设计模式
type Downloader interface{
	Download(uri string)
}
// 结构体
type template struct{
	implement
	uri string
}

// 模板
type implement interface{
	save()
	download()
}


// 策略设计模式
// type Payment interface{
// 	Context *PaymentConext
// 	PaymentMethod PaymentMethod
// }
// type PaymentContext struct{
// 	Name, CardId string
// 	Money float64
// }
// type PaymentMethod interface{
// 	Pay(*PyamentConext)
// }